// 聊天相关工具函数

/**
 * 格式化时间戳
 * @param {number|string} timestamp 时间戳
 * @returns {string} 格式化后的时间字符串
 */
export function formatTime(timestamp) {
  if (!timestamp) return ''
  
  const date = new Date(String(timestamp).length === 10 ? timestamp * 1000 : Number(timestamp))
  return date.toLocaleString('zh-CN', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit'
  })
}

/**
 * 格式化消息内容（简单的HTML转义和换行处理）
 * @param {string} content 消息内容
 * @returns {string} 格式化后的HTML内容
 */
export function formatMessage(content) {
  if (!content) return ''
  
  // 提前抽取 <think>...<\/think> 块，避免被转义，稍后再以安全方式插入
  const thinkBlocks = []
  let extracted = content.replace(/<think>[\s\S]*?<\/think>/g, (m) => {
    const index = thinkBlocks.length
    thinkBlocks.push(m)
    return `__THINK_BLOCK_${index}__`
  })

  // 简单的HTML转义（对抽取占位符之外的文本进行转义）
  let escaped = extracted
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#39;')

  // 将占位符替换为折叠的 details/summary 结构，内部文本继续转义并换行
  thinkBlocks.forEach((rawBlock, i) => {
    const inner = rawBlock.replace(/^<think>|<\/think>$/g, '')
    const innerEscaped = inner
      .replace(/&/g, '&amp;')
      .replace(/</g, '&lt;')
      .replace(/>/g, '&gt;')
      .replace(/"/g, '&quot;')
      .replace(/'/g, '&#39;')
      .replace(/\n/g, '\n') // 保持换行，给 <pre> 使用

    const details = (
      `<details class="think-block"><summary>思考过程（点击展开）</summary>` +
      `<pre>${innerEscaped}</pre></details>`
    )

    const placeholder = new RegExp(`__THINK_BLOCK_${i}__`, 'g')
    escaped = escaped.replace(placeholder, details)
  })

  // 处理换行（非 think 部分）
  escaped = escaped.replace(/\n/g, '<br>')

  return escaped
}

/**
 * 生成请求ID
 * @returns {string} 唯一的请求ID
 */
export function generateRequestId() {
  return 'req_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9)
}

/**
 * 数组去重
 * @param {Array} arr 需要去重的数组
 * @returns {Array} 去重后的数组
 */
export function arrayUnique(arr) {
  return [...new Set(arr)]
}

/**
 * 获取URL查询参数
 * @param {string} name 参数名
 * @returns {string|null} 参数值
 */
export function getQueryVariable(name) {
  const query = window.location.search.substring(1)
  const vars = query.split('&')
  for (let i = 0; i < vars.length; i++) {
    const pair = vars[i].split('=')
    if (pair[0] === name) {
      return decodeURIComponent(pair[1])
    }
  }
  return null
}

/**
 * 复制文本到剪贴板
 * @param {string} text 要复制的文本
 * @returns {Promise<boolean>} 是否复制成功
 */
export async function copyToClipboard(text) {
  try {
    if (navigator.clipboard && window.isSecureContext) {
      await navigator.clipboard.writeText(text)
      return true
    } else {
      // 降级方案
      const textArea = document.createElement('textarea')
      textArea.value = text
      textArea.style.position = 'fixed'
      textArea.style.left = '-999999px'
      textArea.style.top = '-999999px'
      document.body.appendChild(textArea)
      textArea.focus()
      textArea.select()
      const result = document.execCommand('copy')
      textArea.remove()
      return result
    }
  } catch (error) {
    console.error('复制失败:', error)
    return false
  }
}

/**
 * 防抖函数
 * @param {Function} func 要防抖的函数
 * @param {number} wait 等待时间
 * @returns {Function} 防抖后的函数
 */
export function debounce(func, wait) {
  let timeout
  return function executedFunction(...args) {
    const later = () => {
      clearTimeout(timeout)
      func(...args)
    }
    clearTimeout(timeout)
    timeout = setTimeout(later, wait)
  }
}

/**
 * 节流函数
 * @param {Function} func 要节流的函数
 * @param {number} limit 限制时间
 * @returns {Function} 节流后的函数
 */
export function throttle(func, limit) {
  let inThrottle
  return function(...args) {
    if (!inThrottle) {
      func.apply(this, args)
      inThrottle = true
      setTimeout(() => inThrottle = false, limit)
    }
  }
}
